package com.study.config;

import com.study.bean.Color;
import com.study.bean.ColorFactoryBean;
import com.study.bean.Person;
import com.study.bean.Red;
import com.study.condition.LinuxConditional;
import com.study.condition.MyImportBeanDefinitionRegistrar;
import com.study.condition.MyImportSeletor;
import com.study.condition.WindowConditional;
import org.springframework.context.annotation.*;

/**
 * @author wuwenbo
 * @date 2020/3/27 - 19:36
 */
@Configuration
//@Import(Color.class)
//@Import({Color.class, Red.class, MyImportSeletor.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {
    /**    ConfigurableBeanFactory # SCOPE_SINGLETON = "singleton";
     *     ConfigurableBeanFactory # SCOPE_PROTOTYPE = "prototype";
     *
     *     singleton    单实例（默认值）；ioc容器启动会调用方法创建对象放到 ioc 容器中
     *     以后每次获取就是直接从容器（map.get()一个对象）中拿
     *     prototype    多实例的   ioc容器启动并不会去调用方法创建对象放在容器中，
     *     每次获取的时候才会调用方法创建对象
     *     request      同一次请求创建一次实例 (需要联网)
     *     session      同一个session创建一个实例 (需要联网)
     *
     *     懒加载：
     *          单实例bean：默认在容器启动的时候创建对象
     *           @Lazy 懒加载：容器启动的时候不创建对象。第一次使用（获取）Bean创建，并初始化
     */
    //默认是单实例的
  @Scope("singleton")
    @Lazy
    @Bean("person")
    public Person person(){
        System.out.println("从容器中添加 person ");
        return new Person("wuwenbo",35);
    }
    /**
     *      @Conditional :按照一定的条件进行判断，满足条件给容器中注册bean
     *
     *      如果系统是 windows，给容器中注册（"bill"）
     *      如果是linux 系统，给容器中注册("linus")
     *      当然，我们可以把这个注解放在类上，满足配置的条件，该类中所有的bean注册才能生效
     */
    @Conditional(WindowConditional.class)
    @Bean("bill")
    public Person person01(){
        return new Person("BILL",60);
    }
    @Conditional(LinuxConditional.class)
    @Bean("linus")
    public Person person02(){
        return new Person("linus",40);
    }


    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }
}
